from langchain.agents import ZeroShotAgent, AgentExecutor
from langchain.chains.llm import LLMChain
from langchain.chat_models import init_chat_model
from langchain_core.prompts import PromptTemplate
from langchain_core.tools import tool


@tool(
    description="解析求职者简历，提取关键信息（如工作年限、技能标签、项目经验）。"
                "输入参数：求职者简历文本（字符串）"
)
def resume_parser(resume_text: str) -> str:
    """模拟解析简历：提取工作经验和技能（修复匹配逻辑）"""
    # 放宽工作年限判断条件，只要包含"5年"即可
    has_5_year = "5年" in resume_text
    has_key_skills = "Python" in resume_text and "LangChain" in resume_text

    if has_5_year and has_key_skills:
        return (f"解析结果：\n"
                f"- 工作年限：5年\n"
                f"- 核心技能：Python、LangChain、Agent开发、大模型应用\n"
                f"- 项目经验：主导过2个AI Agent相关项目")
    else:
        return (f"解析结果：\n"
                f"- 工作年限：2年\n"
                f"- 核心技能：Java、SpringBoot、基础数据分析\n"
                f"- 项目经验：参与过企业后台系统开发")


@tool(
    description="计算简历与目标岗位的匹配度，返回匹配分数（0-100分）及关键匹配点。"
                "输入参数：解析后的简历信息 "
)
def job_matcher(input_str: str) -> str:
    """模拟岗位匹配：基于技能和经验计算匹配度"""
    resume_info = input_str

    # 匹配逻辑：技能重合度 + 经验匹配度
    skill_match = 0
    if "Python" in resume_info:
        skill_match += 30
    if "LangChain" in resume_info:
        skill_match += 40

    exp_match = 30 if "5年经验" in resume_info else 10

    total_score = skill_match + exp_match
    return (f"匹配结果：\n"
            f"- 匹配分数：{total_score}分\n"
            f"- 匹配点：{'技能高度匹配，经验符合要求' if total_score >= 70 else '技能部分匹配，经验略不足'}\n"
            f"- 建议：{'优先邀约面试' if total_score >= 70 else '可沟通补充技能细节'}")


@tool(
    description="根据匹配结果生成给求职者的沟通话术（如面试邀约、进一步沟通建议）。"
                "输入参数：匹配结果信息（字符串）"
)
def message_generator(match_result: str) -> str:
    """模拟生成沟通话术（修复分数判断逻辑）"""
    # 提取分数并判断范围（>=70分为高匹配）
    if "匹配分数：" in match_result:
        score_str = match_result.split("匹配分数：")[1].split("分")[0]
        try:
            score = int(score_str)
            if score >= 70:
                return (f"【自动沟通话术】\n"
                        f"您好！您的简历与我司「AI Agent开发工程师」岗位匹配度达{score}分，技能和经验符合要求。\n"
                        f"我们希望邀请您本周三下午2点进行线上面试，主要沟通项目细节和技术深度。\n"
                        f"请问您方便吗？")
        except ValueError:
            pass  # 分数解析失败时走默认逻辑

    # 低匹配默认话术
    return (f"【自动沟通话术】\n"
            f"您好！您的简历与「AI Agent开发工程师」岗位匹配度较低，技能有部分重合。\n"
            f"我们想了解您是否有学习LangChain的计划，若方便可简单沟通补充信息~")


# 初始化工具列表
tools = [resume_parser, job_matcher, message_generator]

# 定义Agent提示词（明确固定岗位描述）
prompt_template = """
你是Boss直聘的「智能招聘助手」，负责处理求职者的岗位咨询，流程如下：

1. 首先使用ResumeParser工具解析求职者提供的简历文本，获取关键信息；
2. 然后使用JobMatcher工具，传入解析后的简历信息；
3. 最后使用MessageGenerator工具，根据匹配结果生成回复话术；
4. 所有工具调用需严格按格式：```json{"name":"工具名","parameters":{"参数名":"参数值"}}```

请根据用户输入的简历文本，完成上述流程并返回最终沟通话术。

可用工具：{tools}

用户输入：{input}
"""

# 创建提示词模板
prompt = PromptTemplate(
    template=prompt_template,
    input_variables=["tools", "input"],
    partial_variables={"tools": "\n".join([f"{t.name}: {t.description}" for t in tools])}
)

# 初始化LLM和Agent
llm = init_chat_model("deepseek-chat", model_provider="deepseek")

# 创建ZeroShotAgent
agent = ZeroShotAgent.from_llm_and_tools(
    llm=llm,
    tools=tools,
    prompt=prompt,
    verbose=True,
)

# 创建Agent执行器
agent_executor = AgentExecutor(
    agent=agent,
    tools=tools,
    verbose=True,
    handle_parsing_errors=True,
    max_iterations=4
)

# 测试Agent
if __name__ == "__main__":
    # 测试用例1：高匹配度简历
    resume_high_match = """
    姓名：张三
    工作经验：5年
    技能：Python、LangChain、大模型微调、Agent开发框架
    项目：主导开发过企业级AI客服Agent系统，使用LangChain实现工具调用逻辑
    """

    # 测试用例2：低匹配度简历
    resume_low_match = """
    姓名：李四
    工作经验：2年
    技能：Java、SpringBoot、MySQL、基础Python
    项目：参与开发电商后台管理系统，负责订单模块
    """

    # 执行Agent（测试高匹配用例）
    result = agent_executor.invoke({"input": resume_high_match})
    print("\n最终沟通话术：", result["output"])
